iT邦幫忙

2025 iThome 鐵人賽

DAY 18
0
生成式 AI

打造 AI 微調平台:從系統設計到 AI 協作的 30 天實戰筆記系列 第 18

[Day 18] 模組化設計:拆分核心元件,讓專案更易維護

  • 分享至 

  • xImage
  •  

完整程式碼可在 GitHub 專案中找到:Finetune-30-days-demo / day-18


在過去 17 天裡,我們的專案功能逐步增加:從最初的訓練流程,到 API 服務、推論部署、JWT + RBAC、Audit Log。隨著功能愈來愈多,維護成本測試難度 也開始浮現。

今天,我們聚焦在 模組化設計:把核心元件拆分成 train/data/monitor/ 等模組,讓專案結構更清晰、更容易測試與擴展。


一、為什麼要模組化?

  • 降低耦合度:避免所有功能都擠在 main.py 或單一檔案裡,導致修改一處牽一髮動全身。
  • 提升測試性:模組化後,可以針對 data/validation.pytools/checkpoint_manager.py 單獨測試,不必每次都跑整個系統。
  • 利於擴展:新增功能(像 MLflow、Prometheus)時,只要加模組,而不用改核心程式碼。
  • 團隊協作:不同開發者能各自專注在不同模組,降低衝突。

換句話說,模組化是平台邁向「規模化」的必經之路。


二、專案結構調整

目前我們已經有一些初步模組化(像 auth/jwt_utils.pydata_management/*monitoring/performance.py),但還能更進一步。

我將結構調整為以下形式:

app/
├── api/                 # API 路由
│   └── routes/
├── auth/                # 認證與授權
├── core/                # 系統核心 (config, logger, settings)
├── data/                # 資料相關 (data_management 改名為 data)
│   ├── validation.py
│   ├── analysis.py
│   └── versioning.py
├── monitor/             # 監控 (monitoring 改名為 monitor)
│   ├── performance.py
│   └── audit.py
├── tasks/               # 任務 (訓練 & 推論)
│   ├── training.py
│   └── inference.py
├── tools/               # 輔助工具
└── main.py

主要改進:

  • data/ → 集中資料管理邏輯,避免名稱過長
  • monitor/ → 系統與任務監控拆分,並與 Audit Log 整合
  • core/ → 系統設定(環境、logger)集中管理
  • tasks/ → 除了訓練,也能放推論相關任務

這樣一來,結構不僅更清楚,也能對應到開發與測試的邏輯單元。


三、其他優化

  1. Config 與 Settings 拆分

    • settings/:系統級設定(dotenv、環境變數)
    • config/:實驗級設定(模型、超參數,來自 yaml)
      → 系統設定與實驗設定分開,邏輯更乾淨。
  2. 監控模組強化

    • 任務級監控:每個任務的耗時、tokens/sec
    • 資源級監控:GPU/CPU/Memory
    • 導出介面:未來接 Prometheus Exporter
  3. 測試對應模組化

tests/
├── test_auth.py
├── test_data.py
├── test_monitor.py
├── test_tasks.py
└── test_api.py

模組化後,測試也能清楚對應,符合 TDD 的精神。


Day 18 的關鍵在於,平台不只是功能增加,而是開始注重結構設計
模組化讓專案更易於維護、測試與協作,也讓我們能更安心地持續擴展 —— 不論是加入新的監控、支援更多推論框架,甚至要上 K8s,都能在既有架構下平滑發展。

這是從「能跑」到「能維護」的重要轉折。


📎 AI 協作記錄:今日開發指令

請幫我重構專案目錄,達成更清晰的模組化設計。具體需求如下:

### 1. 資料管理模組
- 將 `app/data_management/` 改名為 `app/data/`
- 檔案重新命名:
  - `data_validator.py` → `validation.py`
  - `dataset_analyzer.py` → `analysis.py`
  - `version_manager.py` → `versioning.py`
- 更新所有 import,確保使用新路徑:
  - `from app.data_management.data_validator import ...` → `from app.data.validation import ...`
  - 其他相同規則依此更新。

### 2. 監控模組
- 將 `app/monitoring/` 改名為 `app/monitor/`
- 保留 `performance.py`
- 新增 `audit.py`,並將 `auth/audit_log.py` 的程式碼移動進來
- 確保 import 更新:
  - `from app.auth.audit_log import ...` → `from app.monitor.audit import ...`

### 3. 認證模組
- `auth/jwt_utils.py` 保留在原位置
- 只刪除 `auth/audit_log.py`(已移動到 `monitor/audit.py`)

### 4. 核心模組
- 新增 `app/core/` 目錄
- 移動以下檔案:
  - `config.py` → `core/config.py`
  - `logger_config.py` → `core/logger.py`(重新命名為更簡潔)
  - `settings.py` → `core/settings.py`
- 更新 import,例如:
  - `from app.config import ...` → `from app.core.config import ...`
  - `from app.logger_config import ...` → `from app.core.logger import ...`

### 5. 任務模組
- `app/tasks/` 保留
- `training.py` 留在原處
- 新增 `inference.py`,並將 `inference_api.py` 的推論服務邏輯移動進來
- 移除 `app/inference_api.py`
- 更新 import:
  - 原本 `from app.inference_api import ...` → `from app.tasks.inference import ...`

### 6. 測試目錄調整
- 建立 `tests/` 目錄(如果尚未存在)
- 拆分測試檔案,依模組對應:
  - `tests/test_auth.py` → 測試 JWT
  - `tests/test_data.py` → 測試資料管理模組
  - `tests/test_monitor.py` → 測試 performance & audit
  - `tests/test_tasks.py` → 測試 Celery 任務與訓練邏輯
  - `tests/test_api.py` → 測試 FastAPI 路由
- 調整 pytest 的 import,確保能找到正確模組。

### 7. README 與 Makefile 更新
- README 中的路徑範例更新,例如:
  - `app/data_management/data_validator.py` → `app/data/validation.py`
- Makefile 中涉及 `inference_api.py` 的命令改成對應 `tasks/inference.py`

---

請在完成後:
1. 確保所有 import 已正確修改。
2. 確保 `pytest` 可以通過(至少能成功載入模組)。
3. 更新 `.gitignore`,避免 `__pycache__/` 舊目錄造成混亂。

上一篇
[Day 17] 系統可追溯性初探:Audit Log 最小實作
下一篇
[Day 19] 依賴關係探索:讀圖與設計修正
系列文
打造 AI 微調平台:從系統設計到 AI 協作的 30 天實戰筆記29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言